#ifndef _IOEVENTBASE_H_
#define _IOEVENTBASE_H_

#include "stdafx.h"
#include <io/iframe.h>
#include <utilex/thread.hpp>

#include "ioimpl/iothreadpool.h"
#include "iooperationimpl.h"

uvNameSpace

class CAsynFrameImpl :	public	IAsynFrame,
						public  IAsynIo,
						public  IPlugin,
						public  IPluginRun,
						public	CUnknownImp,
						public	ithread
{
public:
	CAsynFrameImpl(void);
	virtual ~CAsynFrameImpl(void);

	UNKNOWN_IMP4_(IPlugin, IPluginRun, IAsynFrame, IAsynIo);
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	std_method_impl init_class(IBase* prot, IBase* punkOuter);
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	std_method(Init)(void*);
	std_method(Uninit)();
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	std_method(Start)();
	std_method(Stop)();
	//////////////////////////////////////////////////////////////////////////
	//IAsynFrame
	//////////////////////////////////////////////////////////////////////////
	std_method(AddTimer)(ITimerEvents *pEvents,
		ULONG lTimerId,
		ULONG lMilliSecond,
		BOOL bCycled);
	std_method(DelTimer)(ITimerEvents *pEvents, ULONG lTimerId);
	std_method(ClearTimer)(ITimerEvents *pEvents);
	std_method(CreateAsynIoOperation)(	IIoOperation **ppOperation,
										IIoOperationEvents* pEvent);
	std_method(PostAsynIoOperation)(IIoOperation *pOperation);
	//////////////////////////////////////////////////////////////////////////
	//IAsynIo
	std_method(CreateReadFile)(IBase** pReadFile);
	std_method(CreateWriteFile)(IBase** pWriteFile);
	std_method(CreateAsyncTcpSocket)(IBase** pAsynTcpSocket);
	std_method(CreateTcpSocket)(IBase** pTcpSocket);
	std_method(CreateAsyncUdpSocket)(IBase** pAsynUdpSocket);
	std_method(CreateUdpSocket)(IBase** pUdpSocket);
	std_method(DeleteIo)(IBase* pAsynIo);
	//////////////////////////////////////////////////////////////////////////
protected:
	void	run();
	void	threadstop();
	void	SetService(bool bstart);
		
private:
	static void	StartCBFun(void *pData);
	static void	StopCBFun(void *pData);

private:
	_lComPtr<IComRunningObjectTable>				m_pRot;
private:
	os_sem_t										m_asynframe_sem;
	sentry<io_thread_pool*, default_sentry>			m_pThreadPool;
};
#endif